/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.eventos.bc;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.cip.esymons.eventos.be.EntregaCertificado;
import org.cip.esymons.eventos.be.Matricula;
import org.cip.esymons.eventos.be.ModuloCurso;
import org.cip.esymons.eventos.be.PreinscripcionEvento;
import org.cip.esymons.general.be.ConsejoDepartamental;
import org.cip.esymons.general.be.PersonaNatural;

/**
 *
 * @author Lizardo Rios
 */
@Stateless
public class EntregaCertificadoFacade implements EntregaCertificadoFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(EntregaCertificado entregaCertificado) {
        em.persist(entregaCertificado);
    }

    public void edit(EntregaCertificado entregaCertificado) {
        em.merge(entregaCertificado);
    }

    public void remove(EntregaCertificado entregaCertificado) {
        em.remove(em.merge(entregaCertificado));
    }

    public EntregaCertificado find(Object id) {
        return em.find(EntregaCertificado.class, id);
    }

    public List<EntregaCertificado> findAll() {
        return em.createQuery("select object(o) from EntregaCertificado as o").getResultList();
    }

    public List<EntregaCertificado> listarEntregasXFormato(Integer codigoFormato) {
        return em.createQuery("select e from EntregaCertificado e where e.forCodigo.forCodigo = ?1")
                .setParameter(1, codigoFormato)
                .getResultList();
    }

    public List<EntregaCertificado> listarCertificados2(Integer codEvento, Integer codFormato) {
        return em.createQuery("select e from EntregaCertificado e where e.matCodigo.matCodigo in (select m.matCodigo from Matricula m join m.preinscripcionEvento p where p.pinEsPreinscripcion = true and m.matEstado = 1 and p.evento.eveCodigo = ?1) and e.forCodigo.forCodigo = ?2 order by e.eceOrden")
        //return em.createQuery("select e from EntregaCertificado e where e.matCodigo.matCodigo in (select m.matCodigo from Matricula m join m.preinscripcionEvento p where p.pinEsPreinscripcion = true and m.matEstado = 1 and p.evento.eveCodigo = ?1) and e.forCodigo.forCodigo = ?2 and e.eceEntregado = true order by e.eceOrden")
                    .setParameter(1, codEvento)
                    .setParameter(2, codFormato)
                    .getResultList();
    }

    public List<EntregaCertificado> listarCertificados(Integer codEvento, Integer codFormato) {
        ConsejoDepartamental cons = (ConsejoDepartamental)em.createQuery("select cd from ConsejoDepartamental cd where cd.cdeEstado = true and cd.cdeActivo = true").getSingleResult();
        PersonaNatural pers = new PersonaNatural();
        try {
            pers = (PersonaNatural)em.createQuery("select p from InstructorEvento i join i.perCodigo p where i.preCodigo.preCodigo = ?1 and i.inePrioridad = true").setParameter(1, codEvento).getSingleResult();
        } catch (Exception ex) {
            pers = new PersonaNatural();
            System.out.println("FATAL: " + ex.getMessage());
        }
        List<EntregaCertificado> lista = em.createQuery("select e from EntregaCertificado e where e.matCodigo.matCodigo in (select m.matCodigo from Matricula m join m.preinscripcionEvento p where p.pinEsPreinscripcion = true and m.matEstado = 1 and p.evento.eveCodigo = ?1) and e.forCodigo.forCodigo = ?2 and e.eceEntregado = true order by e.eceOrden")
                                            .setParameter(1, codEvento)
                                            .setParameter(2, codFormato)
                                            .getResultList();
        for (int i=0; i<lista.size(); i++) {
            lista.get(i).setConsejo(cons);
            lista.get(i).setInstructor(pers);

            lista.get(i).setFechaReporte(null);
        }
        return lista;
    }

    public List<EntregaCertificado> listarCertificadosV2(Integer codEvento, Integer codFormato) {
        return em.createQuery("select e from EntregaCertificado e where e.pinCodigo.pinCodigo in (select p.pinCodigo from PreinscripcionEvento p where p.pinEsPreinscripcion = true and p.evento.eveCodigo=?1) and e.forCodigo.forCodigo=?2 order by e.eceOrden")
                .setParameter(1, codEvento)
                .setParameter(2, codFormato)
                .getResultList();
    }

    public List<PreinscripcionEvento> listarPreInscritosV2(Integer codEvento) {
        return em.createQuery("select p from PreinscripcionEvento p where p.pinEsPreinscripcion = true and p.evento.eveCodigo = ?1")
                .setParameter(1, codEvento)
                .getResultList();
    }

    public List<PreinscripcionEvento> listarPreInscritosAEntregarV2(Integer codEvento, Integer codFormato) {
        return em.createQuery("select p from PreinscripcionEvento p where p.pinCodigo not in (select e.pinCodigo.pinCodigo from EntregaCertificado e where e.pinCodigo.pinCodigo in (select p1.pinCodigo from PreinscripcionEvento p1 where p1.pinEsPreinscripcion = true and p1.evento.eveCodigo = ?1) and e.forCodigo.forCodigo = ?2) and p.pinEsPreinscripcion = true and p.evento.eveCodigo = ?1")
                .setParameter(1, codEvento)
                .setParameter(2, codFormato)
                .getResultList();
    }

    public List<EntregaCertificado> listarCertificados(Integer codEvento, Integer codFormato, Integer codModulo) {
        ConsejoDepartamental cons = (ConsejoDepartamental)em.createQuery("select cd from ConsejoDepartamental cd where cd.cdeEstado = true and cd.cdeActivo = true").getSingleResult();
        PersonaNatural pers = new PersonaNatural();
        try {
            pers = (PersonaNatural)em.createQuery("select p from InstructorEvento i join i.perCodigo p where i.preCodigo.preCodigo = ?1 and i.inePrioridad = true").setParameter(1, codEvento).getSingleResult();
        } catch (Exception ex) {
            pers = new PersonaNatural();
            System.out.println("FATAL: " + ex.getMessage());
        }
        ModuloCurso mod = new ModuloCurso();
        try {
            mod = (ModuloCurso)em.createQuery("select m from ModuloCurso m where m.curCodigo.eveCodigo = ?1 and m.modCodigo = ?2")
                                    .setParameter(1, codEvento)
                                    .setParameter(2, codModulo)
                                    .getSingleResult();
        } catch (Exception ex) {
            System.out.println("FATAL: " + ex.getMessage());
            mod = new ModuloCurso();
            try {
                mod = (ModuloCurso)em.createQuery("select mcu from ModuloCurso mcu where mcu.preCodigo.preCodigo = ?1 and mcu.modCodigo = ?2")
                        .setParameter(1, codEvento)
                        .setParameter(2, codModulo)
                        .getSingleResult();
            } catch (Exception ex1) {
                System.out.println("FATAL: " + ex1.getMessage());
                mod = new ModuloCurso();
            }
        }
        List<EntregaCertificado> lista = new ArrayList<EntregaCertificado>();
        try {
            lista = em.createQuery("select e from EntregaCertificado e where e.matCodigo.matCodigo in (select m.matCodigo from Matricula m join m.preinscripcionEvento p where p.pinEsPreinscripcion = true and m.matEstado = 1 and p.evento.eveCodigo = ?1) and e.forCodigo.forCodigo = ?2")
                        .setParameter(1, codEvento)
                        .setParameter(2, codFormato)
                        .getResultList();
        } catch (Exception ex) {
            System.out.println("FATAL: " + ex.getMessage());
        }

        for (int i=0; i<lista.size(); i++) {
            lista.get(i).setConsejo(cons);
            lista.get(i).setInstructor(pers);
            lista.get(i).setModuloCurso(mod);
        }
        return lista;
    }

    public List<Matricula> listarMatriculadosAEntregar(Integer codEvento, Integer codFormato) {
        return em.createQuery("select m from Matricula m join m.preinscripcionEvento p where m.matCodigo not in (select e.matCodigo.matCodigo from EntregaCertificado e where e.matCodigo.matCodigo in (select m1.matCodigo from Matricula m1 join m1.preinscripcionEvento p1 where p1.pinTipo = true and p1.pinEsPreinscripcion = true and m1.matEstado = 1 and p1.evento.eveCodigo = ?1) and e.forCodigo.forCodigo = ?2) and p.pinEsPreinscripcion = true and m.matEstado = 1 and p.evento.eveCodigo = ?1")
                .setParameter(1, codEvento)
                .setParameter(2, codFormato)
                .getResultList();
    }

}
